#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 导入opencv 训练好的模型
    cascade.load("F:\\Project\\arm+opencv+linux\\output\\opencv_4.5.2\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml");

    cap.open(0);// 打开摄像头

    startTimer(100);    // 启动定时器事件 100ms

    connect(&msocket,&QTcpSocket::disconnected,this,&MainWindow::start_connect);
    connect(&msocket,&QTcpSocket::connected,this,&MainWindow::stop_connect);

    // 关联接收数据的槽函数
    connect(&msocket,&QTcpSocket::readyRead,this,&MainWindow::recv_data);
    connect(&mtimer,&QTimer::timeout,this,&MainWindow::timer_connect);

    mtimer.start(5000);         //5s连接一次服务器，连接成功就不在链接
    flag = 0;

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timerEvent(QTimerEvent *event)
{
    // 0采集数据
    Mat srcImage;
    if(cap.grab())
    {
        cap.read(srcImage);    //读取1帧数据
    }

    // 1检测人脸数据
    Mat grayImage;
    cvtColor(srcImage,grayImage,COLOR_BGR2GRAY);    // 采集到的人脸图片转为灰度图
    std::vector<Rect> faceRects;                    // 人脸检测框

    cascade.detectMultiScale(grayImage,faceRects);  // 模型去预测转换后的灰度图
    if(faceRects.size()>0 && flag>=0){

        Rect rect = faceRects.at(0);                //得到一个人脸矩形框
        //rectangle(srcImage,rect,Scalar(0,0,255));   //绘制人脸

        ui->headpicLb->move(rect.x,rect.y);

        if(flag > 2){
            // 把Mat的人脸数据转化为QbyteArray，编码成jpg格式
            std::vector<uchar> buf;
            cv::imencode(".jpg",srcImage,buf);          // 编码人脸图片为.jpg格式
            QByteArray byte((const char*)buf.data(),buf.size());

            // 发送数据到服务器
            quint64 backsize = byte.size();

            QByteArray sendData;
            QDataStream stream(&sendData,QIODevice::WriteOnly);
            stream.setVersion(QDataStream::Qt_5_12);
            stream<<backsize<<byte;

            // 发送
            msocket.write(sendData);
            flag = -2;
        }
        flag++;
    }if(faceRects.size() == 0)
    {
        // 把人脸框移动到中心位置
        ui->headpicLb->move(100,60);
        ui->widget_2->hide();
        flag = 0;
    }

    /* 3显示摄像头图片 */
    if(srcImage.data == nullptr) return;
    cvtColor(srcImage,srcImage,COLOR_BGR2RGB);  // 把opencv的采集的图像格式转换成 QT 的QImage数据
    QImage image(srcImage.data,srcImage.cols,srcImage.rows,srcImage.step1(),QImage::Format_RGB888);
    QPixmap mmp = QPixmap::fromImage(image);
    ui->videoLb->setPixmap(mmp);                // 头像数据显示出来
}

void MainWindow::timer_connect()
{
    // 连接服务器
    msocket.connectToHost("172.19.19.180",9999);
    qDebug()<<"正在连接服务器......\n";


}
void MainWindow::start_connect()
{
    mtimer.start(5000); //5s启动定时器
    qDebug()<<"断开服务器连接\n";
}

void MainWindow::stop_connect()
{
    mtimer.stop();
    qDebug()<<"成功连接服务器\n";
}
void MainWindow::recv_data(){
    QByteArray msg = msocket.readAll();

}


